/**
 * 定义一个生成器函数
 */
function * rootSaga(){
    let a = yield {type:'PUT'};
    let b = yield new Promise((resolve)=>{
        setTimeout(()=>{
            resolve('ok');
        },3000);
    });
    console.log(b)
    let c = yield {type:'PUT'};
}
/**
 * 编写一个自动执行生成器的函数，帮我们从头到尾执行完生成器
 * 其实就是一个生成器函数的执行器
 * @param {*} saga 
 */
function runSaga(saga){
    //通过执行生成器得到迭代器 iterator
    const it = saga();
    function next(val){
        //调用next方法可以启动saga,遇到第一个yield 停止，并返回yield后面的值
        const {value,done} = it.next(val);
        //如果 done为false,取反就是true,就可以进入此方法
        if(!done){
            //如果value值是一个Promise实例的话
            //可以根据不同的值进行不同的处理
            if(value instanceof Promise){
                //为此Promise注册一个成功的回调函数，等待此Promise成功，当成功后走成功的回调
                //value.then(next);
                value.then(val=>next(val));
            }else if(value.type === 'PUT'){
                console.log(value)
                next();
            }else{
                next();
            }
        }
    }
    //先执行一次把它进行启动
    next();
}
runSaga(rootSaga);



/* const it = rootSaga();
it.next();
it.next(); */